<?php
/**
 * Created by Zhy
 * User: Zhy
 * Date: 2018/11/8
 * Time: 14:03
 */

namespace app\api\controller;


use think\Db;

class Order extends Common
{
    /**
     * 已预订
     * user_card：用户身份证号
     * lat：用户纬度
     * lon：用户经度
     * @return \think\response\Json
     */
    public function isAppointment(){
        $params = input('param.');
        $auth = $this->checkAll($params['user_id'], $params['time'], $params['value'], $params['reqKey']);
        if(!$auth){
            return json(['status'=>301,'msg'=>'Token失效！请重新登录！']);
        }
        //未预约
//        if($params['appointment_type'] == 2){
//            //TODO:选择房间、交钱、生成订单
//        }
        //根据身份证号在本地APP查询是否符合当天入住、未消费、未取消的用户订单信息
        $nativeOrder = $this->selectNativeOrderByUserCard($params['user_card']);
        //如果没有本地订单，则查询第三方订单
        if(!$nativeOrder){
            //TODO:查询第三方订单
            $threeOrder = $this->selectThreeOrder($params['user_card']);
            //如果本地APP和第三方都没有订单信息，提示无订单信息
            if(!$threeOrder){
                return json(['status' => 100, 'data' => '暂无订单信息']);
            }
        }
        //根据用户经纬度，计算出离用户最近的酒店的信息
        $minRangeHotel = $this->getMinRangeHotel($params['lat'], $params['lon']);
        //根据订单信息和用户所在酒店信息，判断客户所在酒店是否就是订单上的酒店
        $one = 0;//用于判断是否是同一个酒店，0 不是  1 是
        //与本地APP订单信息比较
        if(!empty($nativeOrder) && $nativeOrder['hotel_id'] = $minRangeHotel['h_id']) {
            $one = 1;
        }
        //与第三方订单比较
//        if(isset($threeOrder) && $threeOrder[''] == $minRangeHotel['']){
//            $one = 1;
//        }
        return json(['status' => 200, 'data' => $one]);
    }
    
    /**
     * 根据用户经纬度，获取用户周边的酒店列表，并由近到远排序
     * @param $lat  用户纬度
     * @param $lon  用户经度
     * @return \think\response\Json
     */
    public function getRangeHotel(){
        $params = input('param.');
        $auth = $this->checkAll($params['user_id'], $params['time'], $params['value'], $params['reqKey']);
        if(!$auth){
            return json(['status'=>301,'msg'=>'Token失效！请重新登录！']);
        }
        //根据当前经纬度，获取距离自己最近的酒店
        $field = "*, round(6378.138*2*asin(sqrt(pow(sin( ({$params['lat']}*pi()/180-h_latitude*pi()/180)/2),2)+cos({$params['lat']}*pi()/180)*cos(h_latitude*pi()/180)* pow(sin( ({$params['lon']}*pi()/180-h_longitude*pi()/180)/2),2)))*1000) as range";
        $order = 'range asc';
        $minRangeHotel = Db::table('up_hotel')
            ->field($field)
            ->order($order)
            ->select();
        return json(['status' => 200, 'data' => $minRangeHotel]);
    }
    
    /**
     * 选择房屋类型列表
     * hotel_id  酒店ID
     * @return \think\response\Json
     */
    public function roomCate(){
        $params = input('param.');
        $auth = $this->checkAll($params['user_id'], $params['time'], $params['value'], $params['reqKey']);
        if(!$auth){
            return json(['status'=>301,'msg'=>'Token失效！请重新登录！']);
        }
        $roomCateList = Db::table('up_room_cate')
            ->where('hotel_id', $params['hotel_id'])
            ->field('c_id, cate_name, cate_log, r_wifi, r_window, r_bathroom, r_people, r_bed, r_breakfast')
            ->select();
        return json(['status'=>200, 'data'=>$roomCateList]);
    }
    
    /**
     * 选择房间页面
     * cate_id  房型ID
     * hotel_id  酒店ID
     * check_time  入住时间
     * leave_time  离店时间
     * @return \think\response\Json
     */
    public function room(){
        $params = input('param.');
        $auth = $this->checkAll($params['user_id'], $params['time'], $params['value'], $params['reqKey']);
        if(!$auth){
            return json(['status'=>301,'msg'=>'Token失效！请重新登录！']);
        }
        //该酒店在用户选择的时间段已被预订的房间  本地app
        $orderRoomList = Db::table('up_order')
            ->whereTime('check_time', '<=', $params['check_time'])
            ->whereTime('leave_time', '>=', $params['leave_time'])
            ->where('hotel_id', $params['hotel_id'])
            ->select();
        //该酒店在用户选择的时间段已被预订的房间  第三方
        //TODO:第三方被预定房间
//        $threeRoomList =
        //被选择房型下的所有房间
        $roomList = Db::table('up_room')
            ->alias('ur')
            ->join('up_room_type urt', 'urt.type_id = ur.r_type', 'left')
            ->where('ur.r_cate', $params['cate_id'])
            ->field('urt.type_name, ur.r_id, ur.r_num, ur.r_log, ur.r_bed, ur.r_breakfast, ur.r_wifi, 
            ur.r_name')
            ->order('ur.r_num asc')
            ->select();
        //筛选出哪些房间可以选，哪些房间不可以选
        foreach($roomList as $key => $vo){
            foreach($orderRoomList as $k => $v){
                if($v['room_id'] == $vo['r_id']){
                    $roomList[$key]['is_choose'] = 2;//已被预订
                }else{
                    $roomList[$key]['is_choose'] = 1;//未被预订
                }
            }
        }
        //通过第三方数据，判断哪些房间已经被选择
//        foreach($roomList as $key1 => $vo1){
//            foreach($threeRoomList as $k1 => $v1){
//
//            }
//        }
        return json(['status'=>200, 'data'=>$roomList]);
    }
    
    /**
     * 生成订单
     * room_id  入住的房间ID
     * hotel_id  入住的酒店ID
     * check_time  入住时间
     * leave_time  离店时间
     * user_card   用户身份证号
     * @return \think\response\Json
     */
    public function createOrder(){
        $params = input('param.');
        $auth = $this->checkAll($params['user_id'], $params['time'], $params['value'], $params['reqKey']);
        if(!$auth){
            return json(['status'=>301,'msg'=>'Token失效！请重新登录！']);
        }
        $order_num = date('YmdHis') . rand(000000, 999999);//订单号
        $night = date('d', strtotime($params['leave_time'])) - date('d', strtotime($params['check_time']));//几晚
        $roomInfo = Db::table('up_room')
            ->where('r_id', $params['room_id'])
            ->find();
        $hotelInfo = Db::table('up_hotel')
            ->where('h_id', $params['hotel_id'])
            ->find();
        $data = [
            'order_num' => $order_num,//订单号
            'user_id' => $params['user_id'],//入住用户
            'room_id' => $params['room_id'],//房间ID
            'hotel_id' => $params['hotel_id'],//酒店ID
            'check_time' => $params['check_time'],//入住时间
            'leave_time' => $params['leave_time'],//离店时间
            'how_rom' => 1,//1间房
            'how_night' => $night,//几晚
            'create_time' => date('Y-m-d H:i:s'),//订单创建时间
            'pay_price' => $roomInfo['r_price'] * $night,//总价格
            'cash_price' => $roomInfo['r_cash'],//押金
            'order_status' => 1,//订单状态  1 未支付  2 已支付  2 取消订单
            'is_consume' => 1,//是否已消费  1 未消费  2 已消费
            'is_cash' => 1,//是否已交押金   1 未交    2 已交未退   3 已交已退
            'user_card' => $params['user_card'],//身份证号
            'h_longitude' => $hotelInfo['h_longitude'],//酒店经度
            'h_latitude' => $hotelInfo['h_latitude'],//酒店纬度
        ];
        //生成订单，并返回订单ID
        $order_id = Db::table('up_order')->insertGetId($data);
        return json(['status' => 200, 'data' => $order_id]);
    }
    
    /**
     * 根据身份证号在本地APP查询是否符合当天入住、未消费、未取消的用户订单信息
     * @param $user_card 身份证号
     * @return false|\PDOStatement|string|\think\Collection
     */
    protected function selectNativeOrderByUserCard($user_card){
        $order = Db::table('up_order')
            ->where('user_card', $user_card)//身份证号
            ->where('is_consume', 1)//未消费
            ->where('order_status', 'neq', 3)//未取消
            ->whereTime('check_time', '=', date('Y-m-d'))//当天入住
            ->order('create_time desc')
            ->limit(1)
            ->select();
        return $order;
    }
    
    /**
     * 查询第三方订单
     * @param $user_card
     */
    protected function selectThreeOrder($user_card){
        
    }
    
    /**
     * 根据用户经纬度，计算出离用户最近的酒店的信息
     * @param $lat  用户纬度
     * @param $lon  用户经度
     * @return false|\PDOStatement|string|\think\Collection
     */
    protected function getMinRangeHotel($lat, $lon){
        //根据当前经纬度，获取距离自己最近的酒店
        $field = "*, round(6378.138*2*asin(sqrt(pow(sin( ({$lat}*pi()/180-h_latitude*pi()/180)/2),2)+cos({$lat}*pi()/180)*cos(h_latitude*pi()/180)* pow(sin( ({$lon}*pi()/180-h_longitude*pi()/180)/2),2)))*1000) as range";
        $order = 'range asc';
        $minRangeHotel = Db::table('up_hotel')
            ->field($field)
            ->order($order)
            ->limit(1)
            ->select();
        return $minRangeHotel;
    }
    
    
    
    /**
     * 选择房屋类型操作
     * cate_id  房型ID
     * @return \think\response\Json
     */
    public function changeRoomCate(){
        $params = input('param.');
        $auth = $this->checkAll($params['user_id'], $params['time'], $params['value'], $params['reqKey']);
        if(!$auth){
            return json(['status'=>301,'msg'=>'Token失效！请重新登录！']);
        }
        $roomCateInfo = Db::table('up_room_cate')
            ->where('c_id', $params['cate_id'])
            ->field('cate_log')
            ->find();
        return json(['status' => 200, 'data' => $roomCateInfo]);
    }
    
    
    
    /**
     * 选择房间操作
     * room_id  房间ID
     * @return \think\response\Json
     */
    public function changeRoom(){
        $params = input('param.');
        $auth = $this->checkAll($params['user_id'], $params['time'], $params['value'], $params['reqKey']);
        if(!$auth){
            return json(['status'=>301,'msg'=>'Token失效！请重新登录！']);
        }
        $roomInfo = Db::table('up_room')
            ->alias('ur')
            ->join('up_room_type urt', 'urt.type_id = ur.r_type', 'left')
            ->where('ur.r_id', $params['room_id'])
            ->field('urt.type_name, ur.r_id, ur.r_num, ur.r_log, ur.r_bed, ur.r_breakfast, ur.r_wifi, 
            ur.r_name')
            ->order('ur.r_num asc')
            ->select();
        return json(['status'=>200, 'data'=>$roomInfo]);
    }
    
    
    
    /**
     * 订单展示
     * order_id 订单ID
     * @return \think\response\Json
     */
    public function showOrder(){
        $params = input('param.');
        $auth = $this->checkAll($params['user_id'], $params['time'], $params['value'], $params['reqKey']);
        if(!$auth){
            return json(['status'=>301,'msg'=>'Token失效！请重新登录！']);
        }
        //订单展示信息
        $orderInfo = Db::table('up_order')->alias('uo')
            ->join('up_u_user uuu', 'uuu.user_id = uo.user_id', 'left')
            ->join('up_hotel uh', 'uh.h_id = uo.hotel_id', 'left')
            ->join('up_room ur', 'ur.r_id = uo.room_id', 'left')
            ->join('up_room_type urt', 'urt.type_id = ur.r_type')
            ->where('o_id', $params['order_id'])
            ->field('uh.h_name, uh.h_address, urt.type_name, ur.r_bed, ur.r_breakfast, ur.r_wifi, 
            uo.check_time, uo.leave_time, uo.how_night, ur.r_num, uo.order_num, uo.create_time, 
            uuu.user_username, uuu.user_id_number')
            ->find();
        return json(['status'=>200, 'data'=>$orderInfo]);
    }
}